package cn.tedu.csmall.product.service.impl;

import cn.tedu.csmall.product.exception.ServiceException;
import cn.tedu.csmall.product.mapper.BrandMapper;
import cn.tedu.csmall.product.pojo.dto.BrandAddNewDTO;
import cn.tedu.csmall.product.pojo.dto.BrandUpdateDTO;
import cn.tedu.csmall.product.pojo.entity.Album;
import cn.tedu.csmall.product.pojo.entity.Brand;
import cn.tedu.csmall.product.pojo.vo.BrandListItemVO;
import cn.tedu.csmall.product.pojo.vo.BrandStandardVO;
import cn.tedu.csmall.product.service.IBrandService;
import cn.tedu.csmall.product.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 品牌模块的业务层
 * @author XingHaiYang
 * @date 2022/11/1 10:21
 */
@Slf4j
@Service
public class BrandServiceImpl implements IBrandService {
    @Autowired
    BrandMapper mapper;

    /**
     * 新增品牌功能
     * @param brandAddNewDTO 从客户端获取到的新增参数
     */
    @Override
    public void addNew(BrandAddNewDTO brandAddNewDTO) {
        log.debug("增加品牌的业务层功能开始，业务参数为={}",brandAddNewDTO);
        String name = brandAddNewDTO.getName();
        log.debug("从业务参数中获取到的新增品牌名为={}",name);
        int count = mapper.countByName(name);
        log.debug("新增品牌之前先检查一下数据库是否已经存在同名的数据，如果存在，不允许重复新增,查询之后的数量为={}",count);
        if(count>0){
            String message = "新增品牌失败，此品牌名【"+name+"】已被占用";
            log.debug(message);
            throw new ServiceException(message);
        }
        Brand brand = new Brand();
        BeanUtils.copyProperties(brandAddNewDTO, brand);
        brand.setCommentCount(0);
        brand.setPositiveCommentCount(0);
        brand.setSales(0);
        brand.setProductCount(0);
        brand.setEnable(1);
        int rows = mapper.insert(brand);
        log.debug("新增品牌成功，新增数量为={}",rows);
        if(rows != 1){
            String message = "新增品牌失败，服务器忙，请稍后再试！";
            log.error(message);
            throw new ServiceException(message);
        }
    }

    /**
     * 删除品牌功能
     * @param id
     */
    @Override
    public void deleteById(Long id) {
        // 删除之前先做查询，如果要删除的数据不存在，直接抛出异常
        BrandStandardVO result = mapper.getStandardById(id);
        if(result == null){
            String message = "此【id】对应的数据不存在";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        // 如果需要删除的数据存在，则正常进行删除功能
        int rows = mapper.deleteById(id);
        log.debug("删除成功");
    }

    /**
     * 编辑品牌
     * @param id 品牌id
     * @param brandUpdateDTO 需要修改的参数进行DTO的封装
     */
    @Override
    public void updateById(Long id, BrandUpdateDTO brandUpdateDTO) {
        log.debug("编辑品牌功能开始,接收到的id值为",id);
        // 修改之前先进行查询，如果数据不存在，抛出异常
        BrandStandardVO result = mapper.getStandardById(id);
        if(result == null){
            String message = "此数据不存在";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        // 如果数据存在，则进行正常编辑品牌功能
        Brand brand = new Brand();
        BeanUtils.copyProperties(brandUpdateDTO,brand);
        brand.setId(id);
        log.debug("修改参数为{}",brand);
        int rows = mapper.updateById(brand);
        if(rows != 1){
            String message = "修改数据失败，服务器忙";
           throw new ServiceException(ServiceCode.ERR_UPDATE,message);
        }
    }

    /**
     * 查询品牌列表功能
     * @return
     */
    @Override
    public List<BrandListItemVO> list() {
        List<BrandListItemVO> list = mapper.list();
        return list;
    }

}
